#include<stdio.h>
#include<string.h>
#include<driver.h>
#include<timer.h>
#include<cmos.h>
#include<system.h>
#include<memory.h>
#include<hardware.h>
//console for OpenKyro
#define MAX_CMD	8

struct term {
	char descrizione[64];
	char nome_comando[10];
	void (*funzione)(void);
};
struct term menu[MAX_CMD];

void menu_serial() {
	init_serial();
	int i;
	char buffer[10];
	printk("Inserisci la parola da trasmettere: "); scank(buffer);
	for(i=0;i<strlen(buffer);i++) {
		send_serial(buffer[i]);
		recv_serial();		// for loopback version
	}
}

void menu_help() {
	int i;
	printk("Comandi disponibili nella console: \n");
	for(i=1;i<MAX_CMD;i++) {
		printk("  "); printk(menu[i].nome_comando); 
		printk(" - "); printk(menu[i].descrizione); printk("\n");
	}
}

void menu_info() {
	printk("OpenKyro\n");
	printk("Versione kernel: 0.1a3 (2/04/2007)\n");
	printk("Versione console: 0.2\n");
}

void menu_status() {
	printk("-Uptime: ");
	int cont,i=0;
	if(minuti) {printn(minuti); printk("min ");}
	printn(secondi); printk("sec\n");
	printk("-RAM: ");
	printn(totale_ram_installata); printk("mb\n");
	printk("-FPU: "); if(check_fpu()==1) printk("yes"); else printk("no");
}

void menu_time() {
	put_config();
	printn(cmos_ora); putk(':',0x7); printn(cmos_minuti);
	putk(':',0x7); printn(cmos_secondi); newk();
	printn(cmos_giorni); putk('/',0x7); printn(cmos_mese);
	putk('/',0x7); printn(cmos_anno);
}


// new console

void add_function(int num,char *nome_cmd,char *descr,void (*funz)(void)) {
	strcopy(menu[num].descrizione,descr);
	strcopy(menu[num].nome_comando,nome_cmd);
	menu[num].funzione=funz;
}

void menu_null() {printk(" ");}

void init_console() {
	add_function(0,"","",menu_null);
	add_function(1,"info","informazioni sul sistema",menu_info);
	add_function(2,"clear","pulisce lo schermo",clear_screen);
	add_function(3,"time","tempo ed ora del sistema",menu_time);
	add_function(4,"status","status del sistema",menu_status);
	add_function(5,"help","questa schermata",menu_help);
	add_function(6,"serial","trasmissione/ricezione da seriale",menu_serial);
	add_function(7,"mappers","mappa la memoria RAM",app_map);
}

void console() {
	char command[10];
	newk(); putk('>',0x4); putk('>',0x4); putk(' ',0x7);
	scank(command);
	int i=0,flag=0;
	while(i<MAX_CMD) {
		if(strcomp(command,menu[i].nome_comando)>0) {
			menu[i].funzione(); flag=1; break;
		} else i++;
	}
	if(flag==0) printk("Comando non trovato, prova con 'help'.");
}

